;主引导程序
;-----------------------------------------------
%include "boot.inc"
;-----------------------------------------------
SECTION MBR vstart=0x7c00
  mov ax,cs
  mov ds,ax
  mov es,ax
  mov ss,ax
  mov fs,ax
  mov sp,0x7c00
  mov ax,0xb800
  mov gs,ax

;清屏
;利用 0x06 号功能，上卷全部行，则可清屏
;-----------------------------------------
;INT 0x10 功能号：0x06 功能描述：上卷窗口
;-----------------------------------------
;输入：
;AH 功能号 0x06
;AL = 上卷的行数（如果为0，表述全部）
;BH = 上卷行属性
;(CL,CH) = 窗口左上角(X,Y)距离
;(DL,DH) = 窗口右下角(X,Y)位置
;返回值 无
  mov ax, 0600h
  mov bx, 0700h
  mov cx, 0 ;左上角(0,0)
  mov dx, 184fh ;右下角(80,25)
                ; VGA模式下一行只能容纳80个字符，共25行

  int 10h
  
  ; 输出背景色绿色，前景色红色，跳动字符串“1 MBR”
  mov byte [gs:0x00],'1'
  mov byte [gs:0x01],0xA4   ;A 表示绿色背景闪烁，4 表示前景色为红色

  mov byte [gs:0x02],' '
  mov byte [gs:0x03],0xA4  

  mov byte [gs:0x04],'M'
  mov byte [gs:0x05],0xA4  

  mov byte [gs:0x06],'B'
  mov byte [gs:0x07],0xA4  

  mov byte [gs:0x08],'R'
  mov byte [gs:0x09],0xA4  

  mov eax,LOADER_START_SECTOR ;起始扇区lba地址
  mov bx,LOADER_BASE_ADDR     ;写入的地址
  mov cx,4                    ;待读取的扇区数
  call rd_disk_m_16           ;读取扇区（程序起始部分）

  jmp LOADER_BASE_ADDR

;--------------------------------------------------------
;功能：读取硬盘n个扇区
rd_disk_m_16:
;--------------------------------------------------------
      ;eax=LBA扇区号
      ;bx=将数据写入的内存地址
      ;cx=读入的扇区数
  mov esi, eax ;备份扇区号
  mov di, cx   ;备份扇区数

  ;写入扇区数
  mov dx, 0x1f2
  mov al, cl
  out dx, al

  mov eax, esi ;还原eax

  ;LBA 0-7
  mov dx, 0x1f3
  out dx, al

  ;LBA 8-15
  mov cl,8
  shr eax,cl
  mov dx, 0x1f4
  out dx, al

  ;LBA 16-23
  shr eax, cl
  mov dx, 0x1f5
  out dx, al

  ;LBA 24-27
  shr eax,cl
  and eax,0xf
  ;device 4-7
  or eax,0xe0
  mov dx, 0x1f6
  out dx, al

  ;command--read
  mov al,0x20
  mov dx, 0x1f7
  out dx, al

  ;check harddisk state
.not_ready:
  nop
  in al, dx
  and al,0x88 ;take 4 & 7 bit num
  cmp al,0x08
  jnz .not_ready    ;not ready,keeping wait

  ;从 0x1f0 端口读数据
  mov ax, di
  mov dx, 256
  mul dx
  mov cx, ax

  mov dx, 0x1f0

.go_on_read:
  in ax, dx
  mov [bx], ax
  add bx, 2
  loop .go_on_read
  ret



  times 510-($-$$) db 0
  db 0x55,0xaa
